//? 参数可能包含函数、正则、日期、ES6新对象

const _shallowClone = target => {

    if (typeof target === 'object' && target !== null) {
        //? .constructor指向对象的构造函数。
        //? 当你创建一个对象时，它会自动获得一个  .constructor  属性，这个属性指向创建这个对象的构造函数  调用时返回值取决于取决于对象是如何创建的 返回格式[Function : 类型]
        const constructor = target.constructor
        console.log(constructor.name)
        //? 其他参数return掉
        if(/^(Function|RegExp|Date|Map|Set)$/i.test(constructor.name)) return target
        const cloneTarget = Array.isArray(target) ? [] : {}
        //? 循环赋值了
        for(const prop in target) {
            //? 这个一定要要，避免如数组length这种属性
            if(target.hasOwnProperty(prop)) {
                cloneTarget[prop] = target[prop]
            }
        }
        return cloneTarget
    } else {
        return target
    }
}
const obj = {name: 'John', age: 25}
const clonedObj = _shallowClone(obj)
console.log(clonedObj) // {name: 'John', age: 25}
console.log(clonedObj === obj) // false
